HomebrewでRISC-V Toolchainを構築
注意 Homebrew でインストールした場合 RV32G(整数・単精度浮動小数点数・倍精度浮動小数点数) のプログラムが Spike シミュレータがうまく動かないので、RV32G を Spike シミュレータで動かしたい場合は以下のどちらかをどうぞ
macOSでRISC-V開発環境を構築する。
HomebrewにRISC-V Toolchainがあるのでそちらを利用する。
【注意】macOS Monterey じゃない人はソースからビルドされるのでインストール完了するのに数時間かかります!!!
インストール
$ brew tap riscv-software-src/riscv
$ brew install riscv-tools
コンパイル & 実行してみる
code:hello.c
int main() {
printf("Hello World\n");
}
$ riscv64-unknown-elf-gcc hello.c -o hello
$ spike pk hello
Hello World が出力されればOK
【追記】RV32も動かしたい
まずは RV32 用の pk (Proxy Kernel) を用意する
code:sh
cd ~/src
cd riscv-pk
mkdir build
cd build
../configure --host=riscv64-unknown-elf --with-arch=rv32i
make
~/src/riscv-pk/build/pk ファイルができるので、それを引数に渡して spike を起動する
code:sh
$ riscv64-unknown-elf-gcc -march=rv32i -mabi=ilp32 hello.c
$ spike --isa=RV32I /Users/thata/src/riscv-pk/build/pk a.out
bbl loader
Hello World
動いた!
rv32imafc は動くの?
-march=rv32imafc -mabi=ilp32f でのビルドはできたものの、spike シミュレータで落ちました。riscv-pk のビルド時に rv32i を渡してるのが原因の一つだろうけど、そもそも riscv-pk は浮動小数点数に対応してくれるのだろうか...(つづく)
code:sh
$ riscv64-unknown-elf-gcc -march=rv32imafc -mabi=ilp32f hello.c
$ spike --isa=RV32I /Users/thata/src/riscv-pk/build/pk a.out
bbl loader
z 00000000 ra 8000452c sp 80216cd0 gp 00000000
tp 00000000 t0 8000ce7c t1 80216e14 t2 00000000
s0 80216cd1 s1 8001405c a0 0000002e a1 00000000
a2 0000003f a3 10000000 a4 10000005 a5 00000000
a6 00000000 a7 00000000 s2 80014064 s3 80014068
s4 80012000 s5 8000eeac s6 00000001 s7 00000000
s8 00000000 s9 8001229b sA 80012260 sB 00000001
t3 80216e4c t4 00000000 t5 00000003 t6 00000000
pc 80005624 va/inst 10000005 sr 80006100
Kernel load segfault @ 0x10000005
$ riscv64-unknown-elf-gcc -march=rv32imafc -mabi=ilp32f test.c
$ spike pk hello
Dockerでビルド、M1ネイティブで実行
Docker環境でビルドし、ネイティブで実行してみる
→ エラーで終了...
code:sh
$ cd ~/src/rv32
$ ./run.sh
(コンテナの中)
$ /opt/rv32gc/cross/bin/riscv32-unknown-elf-gcc hello.c
$ /opt/rv32gc/spike/bin/spike /opt/rv32gc/pk/riscv32-unknown-elf/bin/pk a.out
bbl loader
pi is 3.140000 #<= うまく動いてる (コンテナから抜ける)
$ spike --isa=RV32I /Users/thata/src/riscv-pk/build/pk a.out
bbl loader
z 00000000 ra 8000452c sp 80216cd0 gp 00000000
tp 00000000 t0 8000ce7c t1 80216e14 t2 00000000
s0 80216cd1 s1 8001405c a0 0000002e a1 00000000
a2 0000003f a3 10000000 a4 10000005 a5 00000000
a6 00000000 a7 00000000 s2 80014064 s3 80014068
s4 80012000 s5 8000eeac s6 00000001 s7 00000000
s8 00000000 s9 8001229b sA 80012260 sB 00000001
t3 80216e4c t4 00000000 t5 00000003 t6 00000000
pc 80005624 va/inst 10000005 sr 80006100
Kernel load segfault @ 0x10000005 #<= エラー... M1ネイティブでビルド、Dockerで実行
M1環境でビルド、Docker環境で実行 → うまく動いた。
code:sh
$ cd ~/src/rv32
$ riscv64-unknown-elf-gcc -march=rv32imafc -mabi=ilp32f hello.c
$ ./run.sh
(コンテナの中)
$ /opt/rv32gc/spike/bin/spike /opt/rv32gc/pk/riscv32-unknown-elf/bin/pk a.out
bbl loader
pi is 3.140000
M1上のSpikeに問題があることが分かった。
M1上のspikeでRV32Gを動かしたい
M1 Mac ネイティブで RV32G(IMAFD) を動かしたいので調べてみる。
以下のDockerファイルを参考に手作業でビルドしていく。
RV32G 向けの spike をインストール
code:sh
cd ~/src
mkdir rv32g
cd rv32g
cd riscv-isa-sim/
mkdir build && cd build
../configure --prefix=/Users/thata/src/rv32g/spike --with-isa=rv32g
make
make install
RV32G 向けの pk をインストール
code:sh
cd ~/src/rv32g/
cd riscv-pk
mkdir build && cd build
pkのビルドで失敗する...